package com.vue;

import java.util.*;

import com.metier.*;
import com.persistance.AccesData;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 * Classe Jpanel d'ajout de Borne qui sera integre au Jform principale
 * 
 * @author b0dian
 * @version 1.0
 *
 */
public class AjoutBorne extends JPanel {
	private JLabel lblStation;
	private JLabel lblTypeDeCharge;
	private JLabel lblDateDeMise;
	private JComboBox<String> cbxStation;
	private JComboBox<String> cbxTypeCharge;
	private JTextField textField;
	private JButton btnAnnuler;
	private JButton btnValider;
	private List<Station> lesStations;
	private List<TypeCharge> typeCharges;
	static final String DATE_FORMAT = "jj/mm/aaaa";

	/**
	 * Create the panel.
	 */
	public AjoutBorne() {
		setLayout(null);
		add(getLblStation());
		add(getLblTypeDeCharge());
		add(getLblDateDeMise());
		add(getCbxStation());
		add(getCbxTypeCharge());
		add(getTextField());
		add(getBtnAnnuler());
		add(getBtnValider());

	}

	/**
	 * Create label
	 */
	private JLabel getLblStation() {
		if (lblStation == null) {
			lblStation = new JLabel("Station");
			lblStation.setBounds(10, 31, 46, 14);
		}
		return lblStation;
	}

	/**
	 * Create label
	 */
	private JLabel getLblTypeDeCharge() {
		if (lblTypeDeCharge == null) {
			lblTypeDeCharge = new JLabel("Type de Charge");
			lblTypeDeCharge.setBounds(12, 72, 89, 14);
		}
		return lblTypeDeCharge;
	}

	/**
	 * Create label
	 */
	private JLabel getLblDateDeMise() {
		if (lblDateDeMise == null) {
			lblDateDeMise = new JLabel("date de mise en service jj/mm/aaaa");
			lblDateDeMise.setBounds(12, 119, 181, 14);
		}
		return lblDateDeMise;
	}

	/**
	 * Create ComboBox Et rempli cette comboxBox avec les libelle de stations
	 * recuperes grace au accesData
	 */
	private JComboBox<String> getCbxStation() {
		if (cbxStation == null) {
			cbxStation = new JComboBox<String>();
			cbxStation.setBounds(230, 28, 161, 20);
			lesStations = new ArrayList<Station>();
			lesStations = AccesData.getStations();
			for (Station s : lesStations) {
				cbxStation.addItem(s.getLibelleEmplacement());
			}
			cbxStation.setSelectedIndex(0);
		}
		return cbxStation;
	}

	/**
	 * Create ComboBox Et rempli cette comboxBox avec les libelle de Typecharge
	 * recuperes grace au accesData
	 */
	private JComboBox<String> getCbxTypeCharge() {
		if (cbxTypeCharge == null) {
			cbxTypeCharge = new JComboBox<String>();
			cbxTypeCharge.setBounds(230, 69, 140, 20);
			typeCharges = new ArrayList<TypeCharge>();
			typeCharges = AccesData.getTypesCharges();
			for (TypeCharge t : typeCharges) {
				cbxTypeCharge.addItem(t.getLibelleTypeCharge());
			}
			cbxTypeCharge.setSelectedIndex(0);
		}
		return cbxTypeCharge;
	}

	/**
	 * Create JtextField
	 */
	private JTextField getTextField() {
		if (textField == null) {
			textField = new JTextField();
			textField.setBounds(230, 116, 86, 20);
			textField.setColumns(10);
		}
		return textField;
	}

	/**
	 * Create JButton Avec un evènement sur ce mème bouton en cas de clique qui
	 * remettra les comboBox et le texte field a 0
	 */
	private JButton getBtnAnnuler() {
		if (btnAnnuler == null) {
			btnAnnuler = new JButton("Annuler");
			btnAnnuler.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					cbxStation.setSelectedIndex(0);
					cbxTypeCharge.setSelectedIndex(0);
					textField.setText("");
				}
			});
			btnAnnuler.setBounds(144, 182, 89, 23);

		}
		return btnAnnuler;
	}

	/**
	 * Create JButton Avec un evènement sur ce mème bouton en cas de clique qui
	 * recuperera les informations des comboxBox et du textField pour instancier
	 * un objet borne qui sera ensuite cree dans la base de donne
	 */
	private JButton getBtnValider() {
		if (btnValider == null) {
			btnValider = new JButton("Valider");
			btnValider.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					String d = textField.getText();
					boolean test = false;
					if (estDateValide(d)) {
						test = true;
					} 
					else {
						test = false;
					}
					if (test == true) {
						Borne b = new Borne(d, lesStations.get(
								cbxStation.getSelectedIndex()).getIdStation(),
								typeCharges.get(cbxTypeCharge
										.getSelectedIndex()));
						if (AccesData.createBorne(b) == true) {
							afficheMessage("Ajout effectue");
						} else {
							afficheMessage("Ajout non effectue");
						}
					} else {
						afficheMessage("Erreur de saisie dans la date");
					}
					cbxStation.setSelectedIndex(0);
					cbxTypeCharge.setSelectedIndex(0);
					textField.setText("");

				}
			});
			btnValider.setBounds(263, 182, 89, 23);
		}
		return btnValider;
	}

	/**
	 * Fonction afficheMessage qui affiche des boites de dialogues avec des
	 * messages pour indiquer le bon deroulement ou un problème rencontre lors
	 * de l'ajout de la borne
	 */
	private void afficheMessage(String message) {
		JOptionPane.showMessageDialog(null, message);
	}

	/**
	 * Fonction estDateValide qui verifie que la date entre dans le textField
	 * est une date valide cette fonction sera appele avant l'instanciation de
	 * la borne pour l'ajout
	 */
	public static boolean estDateValide(String date) {

		int jj = 0, mm = 0, aaaa = 0;
		try {
			jj = Integer.parseInt(date.substring(0, 2));
			mm = Integer.parseInt(date.substring(3, 5));
			aaaa = Integer.parseInt(date.substring(6, 10));
		} catch (IndexOutOfBoundsException soobe) {
			return false;
		} catch (NumberFormatException nfe) {
			return false;
		}
		if (jj < 0 || jj > 31) {
			return false;
		} else if (mm < 0 || mm > 12) {
			return false;
		} else if (aaaa < 1900 || aaaa > 2200) {
			return false;
		} else {
			switch (mm) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				if (jj > 31) {
					return false;
				}
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				if (jj > 30) {
					return false;
				}
				break;
			case 2:
				if (estUneAnneeBissextile(aaaa) && jj > 29) {
					return false;
				} else if (!estUneAnneeBissextile(aaaa) && jj > 28) {
					return false;
				}
				break;
			default:
				break;
			}
		}
		return true;
	}

	public static boolean estUneAnneeBissextile(int year) {
		return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
	}
}
